package com.huo.controller.admin;

import com.huo.pojo.Type;
import com.huo.service.TypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.validation.Valid;

@Controller
@RequestMapping("/admin")
public class TypeController {

    @Autowired
    private TypeService typeService;

    //Pageable是SpringData库中定义的一个接口，是所有分页相关信息的一个抽象，
    // 通过该接口，我们可以得到和分页相关所有信息（例如pageNumber、pageSize等）

    //查询返回所有type
    @RequestMapping("/types")
    //前端页面构成的参数会自动封装到Pageable中  设置查询后每页10条记录 根据id倒序排序
    public String types(@PageableDefault(size = 10, sort = {"id"}, direction = Sort.Direction.DESC) Pageable pageable,
                        Model model) {
        model.addAttribute("page", typeService.listType(pageable));
        return "admin/types";
    }

    //返回新增页面 即types-input.html
    @RequestMapping("/types/input")
    public String input(Model model) {
        model.addAttribute("type", new Type());
        return "admin/types-input";
    }

    //新增type
    @PostMapping("/types")
    public String post(@Valid Type type, BindingResult result, RedirectAttributes attributes) {
        Type type1 = typeService.getTypeByName(type.getName());
        //如果type不为空说明已经存在
        if (type1 != null) {
            result.rejectValue("name", "nameError", "不能重复添加分类");
        }
        //后端校验如果没通过就返回到新增页面
        if (result.hasErrors()) {
            return "admin/types-input";
        }
        Type t = typeService.saveType(type);
        if (t == null) {
            attributes.addFlashAttribute("message", "新增失败");
        } else {
            attributes.addFlashAttribute("message", "新增成功");
        }
        //return redirect会重新到controller查询所有type
        return "redirect:/admin/types";
    }

    //修改type 先查询到要修改的type名称 并返回到input页面
    @GetMapping("/types/{id}/input")
    public String editInput(@PathVariable Long id, Model model) {
        model.addAttribute("type", typeService.getType(id));
        return "admin/types-input";
    }

    //修改type //在校验的参数上添加@Valid注解，并且需要传入BindingResult对象，用于获取校验失败情况下的反馈信息
    @PostMapping("/types/{id}") //@PathVariable获取的是请求路径中参数的值 @RequestParam获取的是请求参数，一般是url问号后面的参数值
    public String editPost(@Valid Type type, BindingResult result, @PathVariable Long id, RedirectAttributes attributes) {
        Type type1 = typeService.getTypeByName(type.getName());
        //如果type不为空说明已经存在
        if (type1 != null) {
            result.rejectValue("name", "nameError", "不能重复添加分类");
        }
        //后端校验如果没通过就返回到新增页面
        if (result.hasErrors()) {
            return "admin/types-input";
        }
        Type t = typeService.updateType(id, type);
        if (t == null) {
            attributes.addFlashAttribute("message", "更新失败");
        } else {
            attributes.addFlashAttribute("message", "更新成功");
        }
        //return redirect会重新到controller查询所有type
        return "redirect:/admin/types";
    }

    //删除type
    @GetMapping("/types/{id}/delete")
    public String delete(@PathVariable Long id, RedirectAttributes attributes) {
        typeService.deleteType(id);
        attributes.addFlashAttribute("message", "删除成功");
        return "redirect:/admin/types";
    }
}
